JS中的内存分为堆内存和栈内存
堆内存:存放引用类型数据的值(对象:键值对,函数:代码字符串)
栈内存:提供代码执行的环境,以及存放基本类型值
【堆内存的释放】:让所有引用堆内存空间地址的变量赋值为null(即没有变量占用这个堆内存),浏览器会在空闲的时候自动将其释放
【栈内存的释放】:一般情况下,当函数执行完成,所形成的私有作用域(栈内存)都会自动释放掉(在栈内存中存储的值也都会释放掉),但是也有特殊不销毁的情况。
【特殊不销毁栈内存的情况】
1、函数执行完成后,当前形成的栈内存中,某些内容被栈内存以外的变量占用了(触发闭包机制),此时栈内存不能释放(一旦释放外面将会找不到原有的内容了)
2、全局栈内存(也就是window环境)只有在页面关闭的时候,或者页面刷新的时候,才会被释放掉
如果当前栈内存没有被释放,那么之前在栈内存中存储的基本值也不会被释放,能够一直保存下来
var i = 1;
function fn(i) {
return function(n) {
console.log(n + (++i));
}
}
var f = fn(2); // i:2
f(3); // n:3 i:3 输出 6
fn(5)(6); // 第一步i:5 第二步:输出12
fn(7)(8); //第一步i:7 第二步:输出16
f(4);//8此时在第二次执行f的时候,由于第一次的执行f后的栈内存并没有被释放掉,所以i的值还是第一次执行之后的3,++i之后i的值为4,传入n的值为4,输出结果为4+4=8